package cn.dada.dadarecipes.base.util;

import cn.dada.dadarecipes.base.exception.ServiceException;
import cn.dada.dadarecipes.base.response.StatusCode;

import javax.servlet.http.HttpSession;
import java.util.Optional;

/**
 * 用户登录验证
 * 可以使用多线程操作
 *
 * @see LoginValidation
 * @author Wu
 * @version 1.0
 * @update 2024/10/29
 * @description 用户登录验证工具类
 */
public class LoginValidation {
    /**
     * 普通用户已经登录验证
     * @param session 用户会话
     */
    public static void UserAlreadyLogged(HttpSession session) {
        Optional.ofNullable(session.getAttribute("userId"))
                .ifPresent(merchantId -> {throw new ServiceException(StatusCode.ALREADY_LOGGED);});
    }
    /**
     * 普通用户登录验证
     * @param session 用户会话
     * @return 用户id
     */
    public static Long isLogin(HttpSession session) {
        return Optional.ofNullable(session.getAttribute("userId"))//判断是否登录
                .map(Long.class::cast)//转换为Long类型
                .orElseThrow(() -> new ServiceException(StatusCode.NOT_LOGIN));
    }
    /**
     * 普通用户是否为本人的登录验证
     * @param userId 用户id
     * @param session 用户会话
     * @return session中存储的用户id
     */
    public static Long isMyselfLogin(Long userId, HttpSession session) {
        return Optional.ofNullable((Long)session.getAttribute("userId"))//判断是否登录
                .filter(i -> i.equals(userId))//判断是否是本人
                .orElseThrow(() -> new ServiceException(StatusCode.NOT_LOGIN));
    }




    /**
     * 商家已经登录验证
     * @param session 用户会话
     */
    public static void MerchantAlreadyLogged(HttpSession session) {
        Optional.ofNullable(session.getAttribute("businessId"))
                .ifPresent(merchantId -> {throw new ServiceException(StatusCode.ALREADY_LOGGED);});
    }
    /**
     * 商家用户登录验证
     * @param session 用户会话
     * @return 用户id
     */
    public static Long isMerchantLogin(HttpSession session) {
        return Optional.ofNullable(session.getAttribute("businessId"))//判断是否登录
                .map(Long.class::cast)//
                .orElseThrow(() -> new ServiceException(StatusCode.NOT_LOGIN));
    }
    /**
     * 商家用户是否为本人的登录验证
     * @param businessId 用户id
     * @param session 用户会话
     * @return session中存储的用户id
     */
    public static Long isMerchantMyselfLogin(Long businessId, HttpSession session) {
        return Optional.ofNullable((Long)session.getAttribute("businessId"))//判断是否登录
                .filter(i -> i.equals(businessId))//判断是否是本人
                .orElseThrow(() -> new ServiceException(StatusCode.NOT_LOGIN));
    }
}
